package utils

import (
	"bytes"
	"github.com/gin-gonic/gin"
	"io"
)

// GinGetRequestBody 获取gin请求body
func GinGetRequestBody(c *gin.Context) (string, error) {
	body, err := c.GetRawData() // 读取 request body 的内容
	if err != nil {
		return "", err
	}
	c.Request.Body = io.NopCloser(bytes.NewBuffer(body)) // //很关键，把读过的字节流重新放到body
	return string(body), nil                             // 返回 request body 的值
}

// GinCustomResponseWriter gin中间件获取响应数据
// 由于 Gin 的 ctx 没有暴露响应，无法直接输出响应，但是 ctx 暴露了 ResponsWriter，可以帮我们实现记录响应数据
// 装饰器模式
type GinCustomResponseWriter struct {
	gin.ResponseWriter
	Body *bytes.Buffer //相应体
}

func (w *GinCustomResponseWriter) Write(data []byte) (int, error) {
	w.Body.Write(data)
	return w.ResponseWriter.Write(data)
}

func (w *GinCustomResponseWriter) WriteString(data string) (int, error) {
	w.Body.WriteString(data)
	return w.ResponseWriter.WriteString(data)
}
